// 一、基础类型

// 1.布尔类型
let bool: boolean = false

// 2.数值类型
let num: number = 123
num = 0b111011
num = 0o173
num = 0x7b


// 3.字符串类型
let str: string = 'abc'
str = `数值是${num}`

// console.log(str);

// 4.数组类型
// 写法一、
let arr1: number[] = [5, 6]
let arr3: (string | number)[] = ['abc', 123]
// 写法二、
let arr2: Array<number> = [5, 6]


// 5.元组类型 
let tuple: [string, number, boolean] = ['a', 1, true]

// 6.枚举类型
enum Roles {
  SUPER_ADMIN = 1,
  ADMIN,
  USER = 8
}
// console.log(Roles.ADMIN);
// console.log(Roles[8]);

// 7.any类型
let value: any = '2'
let arr4: any[] = [1, 'a']

// 8.void类型   指定函数返回值类型
// text必须声明类型 配置项strict：false(noImplicitAny)
const consoleText = (text: string): void => {
  console.log(text);
}
// consoleText('a')
let v: void = undefined
v = null //配置项strict：false

// 9.null和undefined
let u: undefined = undefined
let n: null = null
num = undefined //配置项strict：false(strictNullChecks)
num = null

// 10.never类型
// 抛错
const errorFunc = (message: string): never => {
  throw new Error(message)
}
// 死循环
const infiniteFunc = (): never => {
  while (true) { }
}

// let neverVariable = (()=>{
//   while(true){}
// })()
// neverVariable = 123 // 不可以
// num = neverVariable // 可以

// 11.object
let obj = {
  name: 'lison'
}
let obj2 = obj

obj2.name = 'lp'
console.log(obj);
function getObject(obj: object): void {
  console.log(obj);
}
getObject({ name: 'jb' })

// 类型断言
// 两种方式
const getLength = (target: string | number):number => {
  if ((<string>target).length || (target as string).length === 0) {
    return (<string>target).length
  } else {
    return target.toString().length
  }
}